package com.ruoyi.app.config;

import io.minio.MinioClient;
import io.minio.PutObjectArgs;
import io.minio.BucketExistsArgs;
import io.minio.MakeBucketArgs;

import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStream;

/**
 * MinIO 服务配置类，用于处理文件上传相关操作。
 */
public class MinioService {
    /**
     * MinIO 服务器的端点地址。
     */
    private final String endpoint = "http://149.88.80.163:19000";
    /**
     * MinIO 访问密钥 ID。 可以理解为 账号 与 密码
     */
    private final String accessKey = "minioadmin";
    /**
     * MinIO 访问密钥 Secret。
     */
    private final String secretKey = "minioadmin";
    /**
     * 默认存储桶名称。
     */
    private final String bucketName = "buckets";

    /**
     * 上传文件到 MinIO 存储桶。
     *
     * @param filePath       文件的本地路径
     * @param originalFileName 原始文件名，用于生成新的文件名
     * @return 文件的访问 URL
     * @throws Exception 如果文件上传过程中发生错误
     */
    public String uploadFile(String filePath, String originalFileName) throws Exception {
        // 使用时间戳+原始扩展名生成文件名
        String objectName = generateTimestampFileName(originalFileName);
        MinioClient minioClient = MinioClient.builder()
                .endpoint(endpoint)
                .credentials(accessKey, secretKey)
                .build();

        // 检查桶是否存在，不存在则创建
        boolean found = minioClient.bucketExists(BucketExistsArgs.builder().bucket(bucketName).build());
        if (!found) {
            minioClient.makeBucket(MakeBucketArgs.builder().bucket(bucketName).build());
        }

        try (InputStream inputStream = new FileInputStream(filePath)) {
            PutObjectArgs putObjectArgs = PutObjectArgs.builder()
                    .bucket(bucketName)
                    .object(objectName)
                    .stream(inputStream, inputStream.available(), -1)
                    .build();
            minioClient.putObject(putObjectArgs);
        } catch (IOException e) {
            throw new RuntimeException("文件上传失败，原因是IO错误: " + e.getMessage(), e);
        }
        // 返回文件的访问URL
        return endpoint + "/" + bucketName + "/" + objectName;
    }

    /**
     * 根据原始文件名生成带有时间戳的新文件名。
     *
     * @param originalFileName 原始文件名
     * @return 生成的新文件名，包含原始扩展名
     */
    private String generateTimestampFileName(String originalFileName) {
        String ext = "";
        int i = originalFileName.lastIndexOf('.');
        if (i > 0) {
            ext = originalFileName.substring(i);
        }
        // 添加前缀  luoye_
        return "luoye_" + System.currentTimeMillis() + ext;
    }
}
